home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 173 / 173.xpi / chrome / gm-notifier.jar / content / gm-notifier / gm-notifier.js < prev    next >
Text File  |  2009-09-28  |  37KB  |  1,056 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Gmail Notifier code.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Doron Rosenberg.
  18.  * Portions created by the Initial Developer are Copyright (C) 2004 - 2006
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either of the GNU General Public License Version 2 or later (the "GPL"),
  25.  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const nsIGMNotifierProgressListener = Components.interfaces.nsIGMNotifierProgressListener;
  38. const nsIGMNotifierService = Components.interfaces.nsIGMNotifierService;
  39.  
  40. function gm_notifier() {
  41.   // are we logged in?
  42.   this.is_logged_in = false;
  43.   // the listener id the notifier service assigned to us
  44.   this.listenerID = null;
  45.   // the login window
  46.   this.login_window = null;
  47.   // ever logged in
  48.   this.has_ever_logged_in = false;
  49.  
  50.   this.nsIGMNotifierService = null;
  51.   this.nsIGMNotifierProgressListener = null;
  52.  
  53.   // notifier preference class
  54.   this.wm_prefs = new gm_prefs();
  55.   this.wm_prefs.initPrefs();
  56.  
  57.   // should we reset the counter when the UI loads webmail.
  58.   this.reset_counter = this.wm_prefs.getBoolPref(this.wm_prefs.PREF_LOAD_RESET_COUNTER);
  59.  
  60.   this.defaultUser = this.wm_prefs.getCharPref(this.wm_prefs.PREF_DEFAULT_USER);
  61.  
  62.   this.multi_mode = null;
  63.  
  64.   // add pref observers
  65.   this.PrefChangeObserver = {
  66.     observe: function(aSubject, aTopic, aData)
  67.     {
  68.       gGMailNotifier.prefChanged(aData);
  69.     }
  70.   };
  71.  
  72.   this.wm_prefs.addObserver("gm-notifier", this.PrefChangeObserver);
  73. }
  74.  
  75. /**
  76.  * Gets called when a notifier preference changes
  77.  *
  78.  * @param aPrefName - string containing the name of the preference that was changed
  79.  */
  80. gm_notifier.prototype.prefChanged = function(aPrefName) {
  81.   switch(aPrefName){
  82.     case gGMailNotifier.wm_prefs.PREF_STATUSBAR_ENABLED:
  83.       gGMailNotifier.showStatusbarItem();
  84.       break;
  85.  
  86.     case gGMailNotifier.wm_prefs.PREF_LOAD_RESET_COUNTER:
  87.       gGMailNotifier.reset_counter =
  88.         gGMailNotifier.wm_prefs.getBoolPref(gGMailNotifier.wm_prefs.PREF_LOAD_RESET_COUNTER);
  89.       break;
  90.  
  91.     case gGMailNotifier.wm_prefs.PREF_USE_FOLDERVIEW:
  92.       var showFolders = gGMailNotifier.wm_prefs.getBoolPref(gGMailNotifier.wm_prefs.PREF_USE_FOLDERVIEW);
  93.       if (document.getElementById("gm-notifier-toolbar-item")) {
  94.         document.getElementById("gm-notifier-toolbar-item").setAttribute("showFolders", showFolders);
  95.       }
  96.  
  97.       document.getElementById("gm-tooltip-row").collapsed = !showFolders;
  98.       break;
  99.  
  100.     case gGMailNotifier.wm_prefs.PREF_COUNTER_SHOW_INBOX:
  101.       gGMailNotifier.updateLabels(null, true);
  102.       break;
  103.  
  104.     case gGMailNotifier.wm_prefs.PREF_STATUSBAR_POSITION:
  105.       gGMailNotifier.updateStatusBarPosition();
  106.       break;
  107.  
  108.     case gGMailNotifier.wm_prefs.PREF_DEFAULT_USER:
  109.       gGMailNotifier.defaultUserChanged();
  110.       break;
  111.  
  112.     case gGMailNotifier.wm_prefs.PREF_MULTIACCOUNT_ENABLED:
  113.       // multi account enabled/disabled
  114.       gGMailNotifier.toggleMultiAccountMode();
  115.       break;
  116.   }
  117. }
  118.  
  119. /**
  120.  * Gets called when someone clicks on the notifier icon, handles middle click
  121.  *
  122.  * @param aEvent - the event
  123.  */
  124. gm_notifier.prototype.openMiddleClick = function(aEvent) {
  125.   // middle click should open in new tab
  126.   if ((this.is_logged_in) && (aEvent) && (aEvent.button == 1)) {
  127.     this.setNewMailMode(this.defaultUser, false);
  128.     this.loadWebmail(1);
  129.   }
  130. }
  131.  
  132. /**
  133.  * Opens the webmail into the browser, depending on the preference value:
  134.  * 0 - current tab
  135.  * 1 - new tab
  136.  * 2 - new window 
  137.  * 3 - new unfocused tab
  138.  *
  139.  * @param aOverride - force a certain load method
  140.  */
  141. gm_notifier.prototype.loadWebmail = function(aOverride, aUsername) {
  142.   var username = aUsername;
  143.   if (!username) {
  144.     username = this.defaultUser;
  145.   }
  146.  
  147.   var user = username;
  148.   if (!this.nsIGMNotifierService.isHostedDomain(user)) {
  149.     var domain = this.nsIGMNotifierService.getHostedDomain(user);
  150.     if (!domain) {
  151.       user += "@gmail.com";
  152.     }
  153.   }
  154.  
  155.   this.setNewMailMode(username, false);
  156.  
  157.   // should we reset the counter
  158.   if (this.reset_counter) {
  159.     this.nsIGMNotifierService.setResetState(username, true);
  160.   }
  161.  
  162.   var reusetab = true;
  163.  
  164.   try {
  165.     reusetab = !this.wm_prefs.getBoolPref(this.wm_prefs.PREF_DISABLE_TAB_REUSE);
  166.   } catch (e) {}
  167.  
  168.   this.nsIGMNotifierService.loadUserCookies(username);
  169.  
  170.   if (reusetab) {
  171.     // http://developer.mozilla.org/en/docs/XPCNativeWrapper#XPCNativeWrapper_constructor_call_with_string_arguments
  172.     // alert(contentWinWrapper.frames["js"].ma);
  173.     // try to reuse tab
  174.  
  175.     var done = false;
  176.     var tabbrowser = getBrowser();
  177.  
  178.     for (var i = 0; i < tabbrowser.mTabContainer.childNodes.length; i++) {
  179.       var tab = tabbrowser.mTabContainer.childNodes[i];
  180.       var browser = tab.linkedBrowser;
  181.  
  182.       var host = "", path ="";
  183.  
  184.       try {
  185.         host = browser.currentURI.host;
  186.         path = browser.currentURI.path;
  187.       } catch (e){}
  188.  
  189.       if (host == "mail.google.com" && path.indexOf("/mail" == 0)) {
  190.         // we have a gmail browser
  191.         var contentWinWrapper = new XPCNativeWrapper(browser.contentWindow, "window")
  192.  
  193.         // could possibly use idkey rather than username
  194.         if (typeof(contentWinWrapper.window.globals) != "undefined" && typeof(contentWinWrapper.window.globals.USER_EMAIL) == "string" && contentWinWrapper.window.globals.USER_EMAIL == user) {
  195.           getBrowser().selectedTab = tab;
  196.  
  197.           // reload the tab
  198.           // XXX: figure out to do this from within gmail
  199.           getBrowser().reloadTab(getBrowser().selectedTab);
  200.           done = true;
  201.           break;
  202.         } else if (typeof(contentWinWrapper.window.GLOBALS) != "undefined" && typeof(contentWinWrapper.window.GLOBALS[10]) == "string" && contentWinWrapper.window.GLOBALS[10] == user) {
  203.           // Also - GLOBALS
  204.           getBrowser().selectedTab = tab;
  205.  
  206.           // reload the tab
  207.           // XXX: figure out to do this from within gmail
  208.           getBrowser().reloadTab(getBrowser().selectedTab);
  209.           done = true;
  210.           break;
  211.         }
  212.         /*old 1.0 gmail code
  213.         var jsframe = contentWinWrapper.frames["js"];
  214.  
  215.         for (prop in jsframe) {
  216.           if (typeof(jsframe[prop]) == "string" && jsframe[prop] == user) {
  217.             getBrowser().selectedTab = tab;
  218.             done = true;
  219.  
  220.             var mainwindow = contentWinWrapper.frames[0].frames["v1"];
  221.  
  222.             var refresh = mainwindow.document.getElementById("rfr");
  223.             if (refresh) {
  224.               var mouseevent = document.createEvent("MouseEvents");
  225.               mouseevent.initMouseEvent("mousedown", true, false, mainwindow,
  226.                                         0, 0, 0, 0, 0, false, false, false, false, 0, null);
  227.               var cancel = refresh.dispatchEvent(mouseevent);
  228.             }
  229.             break;
  230.           }
  231.         }*/
  232.       }
  233.     }
  234.  
  235.     if (done) {
  236.       return;
  237.     }
  238.   }
  239.  
  240.   var webmailUrl = "mail.google.com/mail";
  241.   var url = this.createURL(webmailUrl, true, username);
  242.  
  243.   if (this.wm_prefs.getBoolPref(this.wm_prefs.PREF_USE_GMAIL_1_0)) {
  244.     url += "/?ui=1";
  245.   }
  246.  
  247.   /* if inbox counter is shown, show inbox, else unread view
  248.   if (this.wm_prefs.getBoolPref(this.wm_prefs.PREF_COUNTER_SHOW_INBOX))
  249.     url = "https://mail.google.com/mail";
  250.   else
  251.     url = "https://mail.google.com/mail/?search=query&q=is%3Aunread&view=tl&start=0"*/
  252.  
  253.   // where to load the webmail into
  254.   var location = aOverride ? aOverride : this.wm_prefs.getIntPref(this.wm_prefs.PREF_LOAD_LOCATION);
  255.  
  256.   if (getBrowser().mCurrentBrowser.currentURI.spec == "about:blank") {
  257.     // if the current tab is empty, use it
  258.     getBrowser().loadURI(url);
  259.   } else if (location == 2) {
  260.     window.open(url);
  261.   } else if ((location == 1) || (location == 3)){
  262.     var myTab = getBrowser().addTab(url, null, null);
  263.  
  264.     // focus tab only if location is 1
  265.     if (location == 1) {
  266.       getBrowser().selectedTab = myTab;
  267.     }
  268.   } else {
  269.     getBrowser().loadURI(url);
  270.   }
  271.  
  272.   //this.updateLabels(true);
  273. }
  274.  
  275. gm_notifier.prototype.createURL = function(aUrl, aHasDomain, aUsername) {
  276.   var url = aUrl;
  277.  
  278.   var username = aUsername;
  279.   if (!username) {
  280.     username = this.defaultUser;
  281.   }
  282.  
  283.   var hashosteddomain = this.nsIGMNotifierService.isHostedDomain(username);
  284.  
  285.   // XXX: big hack here for hosted domains!
  286.   if (aUrl.indexOf("http://") == -1 && aUrl.indexOf("https://") == -1) {
  287.     if (!aHasDomain || hashosteddomain) {
  288.       // add the main url
  289.       if (hashosteddomain) {
  290.         var hosteddomain = username.substring(username.indexOf("@")+1, username.length);
  291.         url = "mail.google.com/a" + "/" + hosteddomain;
  292.         if (!aHasDomain) {
  293.           url += aUrl;
  294.         }
  295.       } else {
  296.         url = "mail.google.com/mail" + url;
  297.       }
  298.     }
  299.  
  300.     /*if (this.wm_prefs.getBoolPref(this.wm_prefs.PREF_UNSECURED_CONNECTION)) {
  301.       url = "http://" + url;
  302.     } else {*/
  303.       url = "https://" + url;
  304.     //}
  305.   }
  306.  
  307.   //url = "https://www.google.com/accounts/ServiceLoginAuth?service=mail&Email="+encodeURIComponent(username)+"&Passwd="+encodeURIComponent(this.nsIGMNotifierService.getPassword(username))+"&continue="+url;
  308.  
  309.  
  310.   return url;
  311. }
  312.  
  313. /**
  314.  * Gets called when someone clicks on the notifier icon
  315.  *
  316.  * @param aEvent - the event
  317.  */
  318. gm_notifier.prototype.login = function(aEvent) {
  319.   // on windows, right click calls this method
  320.   if (aEvent && (aEvent.button == 2)) {
  321.     return;
  322.   }
  323.  
  324.   // if it is a menuitem, then it is a folder dropdown
  325.   if (aEvent.target.tagName == "menuitem") {
  326.     gGMailNotifier.loadFolder(aEvent.target);
  327.   } else if (!this.is_logged_in) {
  328.     this.openLoginWindow();
  329.   } else {
  330.     // middle click should open in new tab - from statusbar
  331.     if ((this.is_logged_in) && aEvent) {
  332.       if (aEvent.button == 1) {
  333.         this.loadWebmail(1);
  334.       } else if (aEvent.ctrlKey) {
  335.         this.loadWebmail(1);
  336.       } else {
  337.         this.loadWebmail();
  338.       }
  339.     } else {
  340.       this.loadWebmail();
  341.     }
  342.   }
  343. }
  344.  
  345. /**
  346.  * Opens the login window and stores a reference to it
  347.  *
  348.  */
  349. gm_notifier.prototype.openLoginWindow = function() {
  350.   if (this.multi_mode && this.supportsMultiMode()) {
  351.     if (this.nsIGMNotifierService.getUserCount() == 0) {
  352.       // if no users exist, open the accounts window
  353.       this.loadAccountsWindow();
  354.     } else {
  355.       window.openDialog("chrome://gm-notifier/content/gm-login-multi.xul", "_blank", "chrome,resizable=yes,dependent=yes");
  356.     }
  357.   } else {
  358.     this.login_window = window.openDialog("chrome://gm-notifier/content/gm-login.xul", "_blank", "chrome,resizable=yes,dependent=yes");
  359.   }
  360. }
  361.  
  362. /**
  363.  * Called by the login window
  364.  *
  365.  * @param aUserName - the username
  366.  * @param aPassword - the password
  367.  */
  368. gm_notifier.prototype.initLogin = function(aUserName, aPassword) {
  369.   this.user_name = aUserName;
  370.   this.password = aPassword;
  371.  
  372.   this.setLoginWindowStatus(1);
  373.   this.startLoginProcess();
  374. }
  375.  
  376. /**
  377.  * Changes state of the login window
  378.  *
  379.  * @param aStatusNum
  380.  */
  381. gm_notifier.prototype.setLoginWindowStatus = function (aStatusNum) {
  382.   if (this.login_window && this.login_window.document)
  383.     this.login_window.setStatus(aStatusNum);
  384. }
  385.  
  386. /**
  387.  * Starts the login process
  388.  *
  389.  */
  390. gm_notifier.prototype.startLoginProcess = function() {
  391.   gGMailNotifier.nsIGMNotifierService.initLogin(gGMailNotifier.user_name, gGMailNotifier.password, gGMailNotifier.listenerID);
  392.   gGMailNotifier.has_ever_logged_in = true;
  393. }
  394.  
  395. /**
  396.  * Checks for new mail
  397.  *
  398.  */
  399. gm_notifier.prototype.checkNow = function() {
  400.   if (this.is_logged_in){
  401.     this.setNewMailMode(this.defaultUser, false);
  402.     this.nsIGMNotifierService.checkNow();
  403.   } else {
  404.     this.openLoginWindow();
  405.   }
  406. }
  407.  
  408. /**
  409.  * Logs out the user
  410.  *
  411.  */
  412. gm_notifier.prototype.logout = function() {
  413.   this.setNewMailMode(this.defaultUser, false);
  414.   this.nsIGMNotifierService.logout();
  415. }
  416.  
  417. /**
  418.  * Gets the default (current) user name
  419.  *
  420.  */
  421. gm_notifier.prototype.getDefaultUserName = function() {
  422.   return this.defaultUser;
  423. }
  424.  
  425. /**
  426.  * Load's a folder from the webmail
  427.  *
  428.  */
  429. gm_notifier.prototype.loadFolder = function(aElement) {
  430.   var url;
  431.   if (aElement.hasAttribute("folderName")) {
  432.     this.setNewMailMode(this.defaultUser, false);
  433.     url = this.createURL("/mail?&search=cat&cat={folder}&view=tl");
  434.  
  435.     var folderName;
  436.     var folderType = aElement.getAttribute("folderType");
  437.     if (folderType == "inbox")
  438.       folderName = "Inbox";
  439.     else
  440.       folderName = aElement.getAttribute("folderName");
  441.  
  442.     url = url.replace("{folder}", encodeURI(folderName));
  443.   } else {
  444.     // compose mail
  445.     url = this.createURL("/mail?view=cm&fs=1&tearoff=1&fs=1");
  446.   }
  447.  
  448.   this.nsIGMNotifierService.loadUserCookies(this.defaultUser);
  449.  
  450.   var location = this.wm_prefs.getIntPref(this.wm_prefs.PREF_LOAD_LOCATION);
  451.  
  452.   if (location == 2) {
  453.     window.open(url);
  454.   } else if ((location == 1) || (location == 3)) {
  455.     var myTab = getBrowser().addTab(url, null, null);
  456.  
  457.     // focus tab only if location is 1
  458.     if (location == 1) {
  459.       getBrowser().selectedTab = myTab;
  460.     }
  461.   } else {
  462.     getBrowser().loadURI(url);
  463.   }
  464. }
  465.  
  466. /**
  467.  * Notifier Progress Listener implementation
  468.  *
  469.  */
  470. gm_notifier.prototype.NotifierProgressListener = function() {
  471.   return ({
  472.     id : null,
  473.  
  474.     getID : function () { return this.id; },
  475.  
  476.     onStateChange : function (aUsername, aState) {
  477.       var toolbarItem = document.getElementById("gm-notifier-toolbar-item");
  478.       if (toolbarItem)
  479.         toolbarItem.removeAttribute("loading");
  480.  
  481.       var defaultUser = gGMailNotifier.getDefaultUserName();
  482.  
  483.       if (aState == nsIGMNotifierProgressListener.LOGIN_INITIATED) {
  484.         if (aUsername == defaultUser) {
  485.           // called when login has been initiated by user
  486.           if (toolbarItem) {
  487.             toolbarItem.setAttribute("loading", "true");
  488.           }
  489.  
  490.           if (document.getElementById("gm-notifier-toolbar-stack")) {
  491.             document.getElementById("gm-notifier-toolbar-stack").setAttribute("selectedIndex", 2);
  492.           }
  493.         }
  494.       } else if (aState == nsIGMNotifierProgressListener.NO_NEW_MAIL) {
  495.         if (aUsername == defaultUser) {
  496.           // no new mail, but the mail count might have decreased!
  497.           gGMailNotifier.updateLabels(false);
  498.         }
  499.       } else if (aState == nsIGMNotifierProgressListener.NEW_MAIL) {
  500.         if (aUsername == defaultUser) {
  501.           // set UI labels
  502.           gGMailNotifier.updateLabels(false);
  503.         }
  504.       } else if (aState == nsIGMNotifierProgressListener.LOGIN_FAILED) {
  505.         // if we failed and not a login window attempt, don't logout ui
  506.         if (gGMailNotifier.login_window && gGMailNotifier.login_window.document) {
  507.           gGMailNotifier.setLoginWindowStatus(3);
  508.           gGMailNotifier.is_logged_in = false;
  509.           gGMailNotifier.updateLabels(false);
  510.           document.getElementById("gm-context-menu-logout").setAttribute("disabled", true);
  511.         }
  512.       } else if (aState == nsIGMNotifierProgressListener.LOGIN_DETAILS_INVALID) {
  513.         // if we failed and not a login window attempt, don't logout ui
  514.         if (gGMailNotifier.login_window && gGMailNotifier.login_window.document) {
  515.           gGMailNotifier.setLoginWindowStatus(4);
  516.           gGMailNotifier.is_logged_in = false;
  517.           gGMailNotifier.updateLabels(false);
  518.           document.getElementById("gm-context-menu-logout").setAttribute("disabled", true);
  519.         }
  520.       } else if (aState == nsIGMNotifierProgressListener.LOGIN_SUCCESS) {
  521.         // set login flags
  522.         gGMailNotifier.has_ever_logged_in = true;
  523.  
  524.         // update the login window
  525.         gGMailNotifier.setLoginWindowStatus(2);
  526.       } else if (aState == nsIGMNotifierProgressListener.LOGOUT) {
  527.         // clean up on logout
  528.         if (gGMailNotifier.is_logged_in) {
  529.           gGMailNotifier.is_logged_in = false;
  530.  
  531.           document.getElementById("gm-context-menu-logout").setAttribute("disabled", true);
  532.           gGMailNotifier.updateLabels(false);
  533.         }
  534.       } else if (aState == nsIGMNotifierProgressListener.LOGOUT_USER) {
  535.         // no need to worry about if no users are logged in anymore, the core
  536.         // service will call LOGOUT on us.
  537.         gGMailNotifier.updateLabels(false);
  538.         gGMailNotifier.buildAccountsSubmenu();
  539.       } else if (aState == nsIGMNotifierProgressListener.LOAD_MAIL) {
  540.         // called when notification gets clicked
  541.         gGMailNotifier.loadWebmail(null, aUsername);
  542.       } else if (aState == nsIGMNotifierProgressListener.ACCOUNTS_CHECK_COMPLETED) {
  543.         gGMailNotifier.onFinishLoginLoad();
  544.         gGMailNotifier.buildAccountsSubmenu();
  545.       } else if (aState == nsIGMNotifierProgressListener.NOTIFIER_LOGGED_IN) {
  546.         if (!gGMailNotifier.is_logged_in) {
  547.           gGMailNotifier.is_logged_in = true;
  548.  
  549.           // if the default user is logged in and we get NOTIFIER_LOGGED_IN,
  550.           // that means we are a new window, so build the UI.
  551.           if (gGMailNotifier.nsIGMNotifierService.getUserState(defaultUser) == nsIGMNotifierService.USER_STATE_LOGGED_IN) {
  552.             gGMailNotifier.updateLabels(false);
  553.             gGMailNotifier.buildAccountsSubmenu();
  554.             gGMailNotifier.mailModeChanged(defaultUser);
  555.           }
  556.         }
  557.       } else if (aState == nsIGMNotifierProgressListener.USER_MODE_CHANGED) {
  558.         if (aUsername == defaultUser) {
  559.           gGMailNotifier.mailModeChanged(aUsername);
  560.         }
  561.       }
  562.     },
  563.  
  564.     QueryInterface : function(aIID) {
  565.       if (aIID.equals(nsIGMNotifierProgressListener) ||
  566.           aIID.equals(Components.interfaces.nsISupports))
  567.         return this;
  568.       throw Components.results.NS_NOINTERFACE;
  569.     }
  570.   });
  571. }
  572.  
  573. /**
  574.  * Called when the login process has been completed
  575.  *
  576.  */
  577. gm_notifier.prototype.onFinishLoginLoad = function() {
  578.   // ui
  579.   var showFolders = gGMailNotifier.wm_prefs.getBoolPref(gGMailNotifier.wm_prefs.PREF_USE_FOLDERVIEW);
  580.   if (document.getElementById("gm-notifier-toolbar-item")) 
  581.     document.getElementById("gm-notifier-toolbar-item").setAttribute("showFolders", showFolders);
  582.  
  583.   document.getElementById("gm-tooltip-row").collapsed = !showFolders;
  584.  
  585.   // set UI labels
  586.   //this.updateLabels(false);
  587.  
  588.   document.getElementById("gm-context-menu-logout").setAttribute("disabled", false);
  589. }
  590.  
  591. /**
  592.  * Login window calls this if we need to store the login details
  593.  *
  594.  */
  595. gm_notifier.prototype.storeLoginDetails = function(aStorePassword) {
  596.   var url = "chrome://gm-notifier/";
  597.  
  598.   if (Components.classes["@mozilla.org/login-manager;1"]) {
  599.     var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  600.  
  601.     if (!passwordManager) {
  602.       return;
  603.     }
  604.  
  605.     var passwords = passwordManager.findLogins({}, url, null, "gm-notifier");
  606.     if (passwords.length > 0) {
  607.       for (var i = 0; i < passwords.length; i++) {
  608.         if (passwords[i].username == this.user_name) {
  609.           passwordManager.removeLogin(passwords[i]);
  610.           break;
  611.         }
  612.       }
  613.     }
  614.  
  615.     var logininfo = Components.classes["@mozilla.org/login-manager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
  616.  
  617.     if (aStorePassword) {
  618.       this.wm_prefs.setBoolPref("gm-notifier.users.remember-password", true);
  619.       this.wm_prefs.setCharPref("gm-notifier.users.default", this.user_name);
  620.       logininfo.init(url, null, "gm-notifier", this.user_name, this.password, "", "");
  621.       passwordManager.addLogin(logininfo);
  622.     } else {
  623.       // if we don't store the password, we store the user name only
  624.       // XXX: FF3 doesn't allow empty/null names - using " ", need to reconsider
  625.       logininfo.init(url, null, "gm-notifier", this.user_name, " ", "", "");
  626.       passwordManager.addLogin(logininfo);
  627.     }
  628.   } else {
  629.     var passwordManager = Components.classes["@mozilla.org/passwordmanager;1"].createInstance();
  630.  
  631.     if (passwordManager) {
  632.       passwordManager = passwordManager.QueryInterface(Components.interfaces.nsIPasswordManager);
  633.  
  634.       try {
  635.         passwordManager.removeUser(url, this.user_name);
  636.       } catch (e) {}
  637.  
  638.       if (aStorePassword) {
  639.         this.wm_prefs.setBoolPref("gm-notifier.users.remember-password", true);
  640.         this.wm_prefs.setCharPref("gm-notifier.users.default", this.user_name);
  641.         passwordManager.addUser(url, this.user_name, this.password);
  642.       } else {
  643.         // if we don't store the password, we store the user name only
  644.         passwordManager.addUser(url, this.user_name, "");
  645.       }
  646.     }
  647.   }
  648. }
  649.  
  650. gm_notifier.prototype.updateLabels = function(aIconClicked, aSkipNewMailCheck) {
  651.   // update the UI objects
  652.   document.getElementById("gm-notifier-statusbar").setAttribute("logged-in", this.is_logged_in);
  653.  
  654.   if (document.getElementById("gm-notifier-toolbar-item"))
  655.     document.getElementById("gm-notifier-toolbar-item").setAttribute("logged-in", this.is_logged_in);
  656.  
  657.   if (this.is_logged_in) {
  658.     var unread = this.nsIGMNotifierService.getDisplayCount(this.defaultUser);
  659.     var newCount = this.nsIGMNotifierService.getNewCount(this.defaultUser);
  660.  
  661.     if (!aSkipNewMailCheck && !this.nsIGMNotifierService.getNewMailMode(this.defaultUser) && (newCount > 0)) {
  662.       //this.setNewMailMode(this.defaultUser, true);
  663.     }
  664.  
  665.     if (document.getElementById("gm-notifier-toolbar-item")) {
  666.       document.getElementById("gm-notifier-toolbar-item").setAttribute("unread", unread);
  667.     }
  668.  
  669.     if (document.getElementById("gm-notifier-statusbar")) {
  670.       document.getElementById("gm-notifier-statusbar").setAttribute("label", unread);
  671.     }
  672.  
  673.     // tooltip labels
  674.     document.getElementById("gm-notifier-tooltip-labels").hidden = false;
  675.  
  676.     var myTooltipRows = document.getElementById("gm-tooltip-row");
  677.     var dropdownLabels = document.getElementById("gm-notifier-toolbar-item-menupopup");
  678.  
  679.     // clear current tooltip entries
  680.     for (var run = myTooltipRows.childNodes.length; run--; run > 0){
  681.       myTooltipRows.removeChild(myTooltipRows.childNodes.item(run));
  682.     }
  683.  
  684.     if (dropdownLabels) {
  685.       // clear current dropdown entries
  686.       for (var run = dropdownLabels.childNodes.length; run--; run > 0) {
  687.         dropdownLabels.removeChild(dropdownLabels.childNodes.item(run));
  688.       }
  689.     }
  690.  
  691.     // handle folders
  692.     var folderLength = this.nsIGMNotifierService.getFolderCount(this.defaultUser);
  693.     var foldername;
  694.  
  695.     for (var run = 0; run < folderLength; run++) {
  696.       var folderItem = this.nsIGMNotifierService.getFolderItem(this.defaultUser, run, {});
  697.  
  698.       var myRow = document.createElement("row");
  699.  
  700.       var myLabel = document.createElement("label");
  701.  
  702.       foldername = unescape(folderItem[0]);
  703.       if (run == 0) {
  704.         // inbox is always first
  705.         foldername = this.getString("InboxTitle");
  706.       }
  707.  
  708.       myLabel.setAttribute("value", foldername);
  709.       myRow.appendChild(myLabel);
  710.  
  711.       myLabel = document.createElement("label");
  712.       myLabel.setAttribute("value", folderItem[1]);
  713.       myRow.appendChild(myLabel);
  714.  
  715.       myTooltipRows.appendChild(myRow);
  716.  
  717.       // handle dropdown
  718.       if (dropdownLabels) {
  719.         var myMenuitem = document.createElement("menuitem");
  720.         myMenuitem.setAttribute("label", foldername + ": " + folderItem[1]);
  721.         myMenuitem.setAttribute("folderName", foldername);
  722.  
  723.         // inbox?
  724.         if (run == 0) {
  725.           myMenuitem.setAttribute("folderType", "inbox")
  726.         } else {
  727.           myMenuitem.setAttribute("folderType", "folder")
  728.         }
  729.  
  730.         dropdownLabels.appendChild(myMenuitem);
  731.       }
  732.     }
  733.  
  734.     if (dropdownLabels) {
  735.       // compose item
  736.       var temp = document.createElement("menuseparator");
  737.       dropdownLabels.appendChild(temp);
  738.       temp = document.createElement("menuitem");
  739.       temp.setAttribute("label", this.getString("ComposeMailLabel"));
  740.       temp.setAttribute("accesskey", this.getString("ComposeMailAccesskey"));
  741.       dropdownLabels.appendChild(temp);
  742.     }
  743.  
  744.   } else {
  745.     if (document.getElementById("gm-notifier-toolbar-item"))
  746.       document.getElementById("gm-notifier-toolbar-item").setAttribute("unread", "");
  747.  
  748.     if (document.getElementById("gm-notifier-statusbar"))
  749.       document.getElementById("gm-notifier-statusbar").setAttribute("label", "");
  750.  
  751.     document.getElementById("gm-notifier-tooltip-labels").hidden = true;
  752.   }
  753.  
  754.   if (this.multi_mode) {
  755.     this.setMultiModeUI();
  756.   }
  757. }
  758.  
  759. gm_notifier.prototype.setNewMailMode = function(aUsername, aValue) {
  760.   this.nsIGMNotifierService.setNewMailMode(aUsername, aValue);
  761. }
  762.  
  763. gm_notifier.prototype.getLoginDetails = function(aUsername){
  764.   var url = "chrome://gm-notifier/";
  765.  
  766.   // check for toolkit's login manager (Mozilla 1.9)
  767.   if (Components.classes["@mozilla.org/login-manager;1"]) {
  768.     var passwordManager = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager);
  769.     var logins = passwordManager.findLogins({}, url, null, "gm-notifier");
  770.  
  771.     for (var i = 0; i < logins.length; i++) {
  772.       if (logins[i].username == aUsername) {
  773.         password = logins[i].password;
  774.  
  775.         // XXX: why not call the service here to get password?
  776.         if (password === " ") {
  777.           // XXX: empty password is " " for now due to ff3 change
  778.           password = "";
  779.         }
  780.  
  781.         return password;
  782.       }
  783.     }
  784.   } else {
  785.     var passwordManager = Components.classes["@mozilla.org/passwordmanager;1"].createInstance(Components.interfaces.nsIPasswordManagerInternal);
  786.     var host = {value:""};
  787.     var user =  {value:""};
  788.     var password = {value:""}; 
  789.  
  790.     try {
  791.       passwordManager.findPasswordEntry(url, aUsername, "", host, user, password);
  792.     } catch(e){ }
  793.  
  794.     return password.value;
  795.   }
  796.  
  797.   return null
  798. }
  799.  
  800. gm_notifier.prototype.showStatusbarItem = function(aShowItem) {
  801.    if (aShowItem != null){
  802.      this.wm_prefs.setBoolPref(this.wm_prefs.PREF_STATUSBAR_ENABLED, aShowItem);
  803.    }
  804.  
  805.    var prefValue = aShowItem ? aShowItem : this.wm_prefs.getBoolPref(this.wm_prefs.PREF_STATUSBAR_ENABLED);
  806.  
  807.    document.getElementById("gm-notifier-statusbar").collapsed = !prefValue;
  808. }
  809.  
  810. gm_notifier.prototype.updateStatusBarPosition = function() {
  811.   var index = this.wm_prefs.getIntPref(this.wm_prefs.PREF_STATUSBAR_POSITION);
  812.  
  813.   if (index < 1)
  814.     return;
  815.  
  816.   var statusBar = document.getElementById("status-bar");
  817.   var children = statusBar.childNodes;
  818.  
  819.   var statusbarItem = document.getElementById("gm-notifier-statusbar");
  820.   var newStatusbarItem = statusBar.removeChild(statusbarItem);
  821.  
  822.   if ((children.length == 0) || (index >= children.length))
  823.     statusBar.appendChild(newStatusbarItem);
  824.   else
  825.     statusBar.insertBefore(newStatusbarItem, children[index-1]);
  826. }
  827.  
  828. gm_notifier.prototype.loadPrefWindow = function() {
  829.   window.openDialog("chrome://gm-notifier/content/gm-preferences.xul", "", "centerscreen,chrome,resizable=no,dependent=yes")
  830. }
  831.  
  832. gm_notifier.prototype.getString = function(aName) {
  833.   var strbundle = document.getElementById("gm-notifier-stringbundle");
  834.   return strbundle.getString(aName);
  835. }
  836.  
  837. gm_notifier.prototype.getFormattedString = function(aName, aStrArray) {
  838.   var strbundle = document.getElementById("gm-notifier-stringbundle");
  839.   return strbundle.getFormattedString(aName, aStrArray);
  840. }
  841.  
  842. gm_notifier.prototype.fillInTooltip = function(aTooltipElement) {
  843.   document.getElementById("gm-notifier-tooltip-logged-in").collapsed = !this.is_logged_in;
  844.   document.getElementById("gm-notifier-tooltip-logged-out").collapsed = this.is_logged_in;
  845.  
  846.   if (this.is_logged_in) {
  847.     var username = this.getDefaultUserName();
  848.     document.getElementById("gm-notifier-tooltip-username").value = username;
  849.  
  850.     document.getElementById("gm-notifier-tooltip-unread").value = 
  851.       this.getFormattedString("TooltipUnread", [this.nsIGMNotifierService.getDisplayCount(username)]);
  852.  
  853.     document.getElementById("gm-notifier-tooltip-quota").value =
  854.       this.getFormattedString("TooltipQuota", [this.nsIGMNotifierService.getUsedMB(username),
  855.                                                this.nsIGMNotifierService.getSpaceUsed(username),
  856.                                                this.nsIGMNotifierService.getTotalSpace(username)]);
  857.   } else {
  858.   }
  859. }
  860.  
  861. gm_notifier.prototype.toggleMultiAccountMode = function() {
  862.   if (!this.supportsMultiMode()) {
  863.     this.multi_mode = false;
  864.     return;
  865.   }
  866.  
  867.   var value = this.wm_prefs.getBoolPref(this.wm_prefs.PREF_MULTIACCOUNT_ENABLED);
  868.  
  869.   if (value != this.multi_mode) {
  870.     this.multi_mode = value;
  871.     this.setMultiModeUI();
  872.   }
  873. }
  874.  
  875. gm_notifier.prototype.setMultiModeUI = function() {
  876.   // show/hide the menuitem
  877.   var contextmenu = document.getElementById("gm-notifier-context-menu-accounts");
  878.   var contextmenu2 = document.getElementById("gm-notifier-context-menu-accounts-manage");
  879.  
  880.   if (contextmenu && contextmenu2) {
  881.     if (this.multi_mode && this.supportsMultiMode()) {
  882.       contextmenu2.collapsed = !this.is_logged_in;
  883.       contextmenu.collapsed = this.is_logged_in;
  884.     } else {
  885.       contextmenu2.collapsed = true;
  886.       contextmenu.collapsed = true;
  887.     }
  888.   }
  889. }
  890.  
  891. gm_notifier.prototype.buildAccountsSubmenu = function() {
  892.   var separator = document.getElementById("gm-notifier-context-menu-accounts-separator");
  893.  
  894.   if (!separator)
  895.     return;
  896.  
  897.   this.setMultiModeUI();
  898.  
  899.   // clear
  900.   var sibling = separator.nextSibling;
  901.   while (sibling) {
  902.     temp = sibling;
  903.     sibling = sibling.nextSibling;
  904.  
  905.     separator.parentNode.removeChild(temp);
  906.   }
  907.   var usercount = this.nsIGMNotifierService.getQueueCount();
  908.  
  909.   for (var i = 0; i < usercount; i++) {
  910.     var name =  this.nsIGMNotifierService.getQueueUserName(i);
  911.     var state = this.nsIGMNotifierService.getUserState(name);
  912.  
  913.     // skip invalid details
  914.     if (state == nsIGMNotifierService.USER_STATE_INVALID_DETAILS)
  915.       continue;
  916.  
  917.     var menuitem = document.createElement("menuitem");
  918.     menuitem.setAttribute("id", "gm-notifier-context-menu-accounts-list-" + name);
  919.     menuitem.setAttribute("value", name);
  920.  
  921.     var str = name;
  922.  
  923.     // if logged in, show the count
  924.     if (state == nsIGMNotifierService.USER_STATE_LOGGED_IN) {
  925.       var count = this.nsIGMNotifierService.getDisplayCount(name);
  926.       str += " (" + count + ")";
  927.     }
  928.  
  929.     menuitem.setAttribute("label", str);
  930.     menuitem.setAttribute("type", "radio");
  931.  
  932.     // if the default user, check it
  933.     if (name == this.defaultUser) {
  934.       menuitem.setAttribute("checked", "true");
  935.       menuitem.style.fontWeight = "bold";
  936.     }
  937.  
  938.     separator.parentNode.appendChild(menuitem);
  939.   }
  940. }
  941.  
  942. gm_notifier.prototype.accountSwap = function(aEvent) {
  943.   var name = aEvent.target.getAttribute("value");
  944.  
  945.   // no value or is the default user already, do nothing.
  946.   if (!name || name == gGMailNotifier.defaultUser) {
  947.     return;
  948.   }
  949.  
  950.   var currentItem = document.getElementById("gm-notifier-context-menu-accounts-list-" + gGMailNotifier.defaultUser);
  951.   if (currentItem) {
  952.     currentItem.setAttribute("checked", false);
  953.     currentItem.style.fontWeight = "";
  954.   }
  955.  
  956.   currentItem = document.getElementById("gm-notifier-context-menu-accounts-list-" + name);
  957.  
  958.   if (currentItem) {
  959.     currentItem.setAttribute("checked", true);
  960.     currentItem.style.fontWeight = "bold";
  961.   }
  962.  
  963.   // change default user
  964.   gGMailNotifier.wm_prefs.setCharPref(this.wm_prefs.PREF_DEFAULT_USER, name);
  965.  
  966.   gGMailNotifier.mailModeChanged(name);
  967. }
  968.  
  969. gm_notifier.prototype.loadAccountsWindow = function() {
  970.   window.openDialog("chrome://gm-notifier/content/gm-accounts.xul", "gm-notifier:accounts", "centerscreen,chrome,resizable=no,dependent=yes");
  971. }
  972.  
  973. gm_notifier.prototype.defaultUserChanged = function() {
  974.   this.defaultUser = this.wm_prefs.getCharPref(this.wm_prefs.PREF_DEFAULT_USER);
  975.  
  976.   this.updateLabels();
  977. }
  978.  
  979. gm_notifier.prototype.mailModeChanged = function(aUsername) {
  980.   var value = gGMailNotifier.nsIGMNotifierService.getNewMailMode(aUsername);
  981.   if (document.getElementById("gm-notifier-toolbar-item"))
  982.     document.getElementById("gm-notifier-toolbar-item").setAttribute("new-mail", value ? "true" : "false");
  983.  
  984.   if (document.getElementById("gm-notifier-statusbar"))
  985.     document.getElementById("gm-notifier-statusbar").setAttribute("new-mail", value ? "true" : "false");
  986. }
  987.  
  988. gm_notifier.prototype.supportsMultiMode = function() {
  989.   var supports = false;
  990.  
  991.   try {
  992.     var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
  993.                             .getService(Components.interfaces.nsIXULAppInfo);
  994.     if (appInfo.platformVersion >= "1.8.1")
  995.       supports = true;
  996.   } catch (e) {}
  997.  
  998.   return supports;
  999. }
  1000.  
  1001. // startup
  1002. gm_notifier.prototype.onload = function() {
  1003.   // this is false if we are in ff's customize window
  1004.   if (document.getElementById("gm-notifier-statusbar")) {
  1005.     // add the listener on startup and init the xpcom class
  1006.     try {
  1007.       gGMailNotifier.nsIGMNotifierService = Components.classes["@mozilla.org/GMailNotifier;1"]
  1008.                                                   .getService(Components.interfaces.nsIGMNotifierService);
  1009.       gGMailNotifier.nsIGMNotifierProgressListener = new gGMailNotifier.NotifierProgressListener()
  1010.       gGMailNotifier.listenerID = gGMailNotifier.nsIGMNotifierService.addListener(gGMailNotifier.nsIGMNotifierProgressListener);
  1011.       gGMailNotifier.nsIGMNotifierProgressListener.id = gGMailNotifier.listenerID;
  1012.  
  1013.       document.getElementById("gm-notifier-statusbar").collapsed = !gGMailNotifier.wm_prefs.getBoolPref(gGMailNotifier.wm_prefs.PREF_STATUSBAR_ENABLED);
  1014.  
  1015.       // init multi-mode setup
  1016.       gGMailNotifier.toggleMultiAccountMode();
  1017.     } catch (e) {
  1018.       alert(e);
  1019.     }
  1020.  
  1021.     window.removeEventListener("load", gGMailNotifier.onload, false);
  1022.     gGMailNotifier.updateStatusBarPosition();
  1023.   }
  1024. }
  1025.  
  1026. // shutdown
  1027. gm_notifier.prototype.onunload = function() {
  1028.   if (document.getElementById("gm-notifier-statusbar")) {
  1029.     // cleanup time, but only if the statusbar item exists, due to toolkit's
  1030.     // customize window feature.
  1031.  
  1032.     // remove the listener
  1033.     if (gGMailNotifier.nsIGMNotifierService)
  1034.       gGMailNotifier.nsIGMNotifierService.removeListener(gGMailNotifier.nsIGMNotifierProgressListener);
  1035.   }
  1036.  
  1037.   // remove the pref observer
  1038.   if (gGMailNotifier.wm_prefs)
  1039.     gGMailNotifier.wm_prefs.removeObserver("gm-notifier", gGMailNotifier.PrefChangeObserver);
  1040.  
  1041.   // last, but not least, clear the whole object
  1042.   gGMailNotifier = null;
  1043. }
  1044.  
  1045. gm_notifier.prototype.initPopup = function() {
  1046.   document.getElementById("gm-context-menu-statusbar-item").setAttribute("checked", gGMailNotifier.wm_prefs.getBoolPref(gGMailNotifier.wm_prefs.PREF_STATUSBAR_ENABLED));
  1047.  
  1048.   // returning true will make the popup show
  1049.   return true;
  1050. }
  1051.  
  1052. var gGMailNotifier = new gm_notifier();
  1053.  
  1054. window.addEventListener("load", gGMailNotifier.onload, false);
  1055. window.addEventListener("unload", gGMailNotifier.onunload, false);
  1056.